package fi.vincit.jmobster.processor.frameworks.backbone.validator.writer; /* * Copyright 2012-2013 Juha Siponen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import fi.vincit.jmobster.annotation.OverridePattern; import fi.vincit.jmobster.processor.languages.javascript.JavaScriptContext; import fi.vincit.jmobster.processor.languages.javascript.writer.OutputMode; import fi.vincit.jmobster.util.Optional; import fi.vincit.jmobster.util.itemprocessor.ItemStatus; import fi.vincit.jmobster.util.itemprocessor.ItemStatuses; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import javax.validation.constraints.Pattern; import java.util.Arrays; import java.util.Collection; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith( Parameterized.class ) public class PatternValidatorTest extends BaseValidatorTest { private String output; private String regexp; private String overriddenRegexp; private Pattern.Flag[] flags; private static final Pattern.Flag[] EMPTY_FLAGS = new Pattern.Flag[0]; private static final Pattern.Flag[] I_FLAG = new Pattern.Flag[] {Pattern.Flag.CASE_INSENSITIVE}; private static final Pattern.Flag[] TWO_FLAGS = new Pattern.Flag[] {Pattern.Flag.CASE_INSENSITIVE, Pattern.Flag.MULTILINE}; private static final String NO_OVERRIDDEN = ""; public PatternValidatorTest( OutputMode mode, String regexp, String overriddenRegexp, Pattern.Flag[] flags, String output) { super(mode); this.output = output; this.regexp = regexp; this.overriddenRegexp = overriddenRegexp; this.flags = flags; } @Parameterized.Parameters public static Collection<Object[]> data() { Object[][] data = new Object[][] { { OutputMode.JAVASCRIPT, "[abc]", NO_OVERRIDDEN, EMPTY_FLAGS, "pattern: /[abc]/" }, { OutputMode.JAVASCRIPT, "[abc]", "[qwerty]", EMPTY_FLAGS, "pattern: /[qwerty]/" }, { OutputMode.JAVASCRIPT, "[abc]", NO_OVERRIDDEN, I_FLAG, "pattern: /[abc]/i" }, { OutputMode.JAVASCRIPT, "[abc]", NO_OVERRIDDEN, TWO_FLAGS, "pattern: /[abc]/im" }, { OutputMode.JAVASCRIPT, "[abc]", "[qwerty]", I_FLAG, "pattern: /[qwerty]/i" }, { OutputMode.JAVASCRIPT, "[abc]", "[qwerty]", TWO_FLAGS, "pattern: /[qwerty]/im" }, { OutputMode.JAVASCRIPT, "[\"ABCdef]*", NO_OVERRIDDEN, EMPTY_FLAGS, "pattern: /[\"ABCdef]*/" }, { OutputMode.JAVASCRIPT, "\"[\"ABCdef\"]*\"\"", NO_OVERRIDDEN, EMPTY_FLAGS, "pattern: /\"[\"ABCdef\"]*\"\"/" }, { OutputMode.JAVASCRIPT, "[\\.ABCdef]*", NO_OVERRIDDEN, EMPTY_FLAGS, "pattern: /[\\.ABCdef]*/" }, { OutputMode.JAVASCRIPT, "\\\"[\\.ABCdef]*", NO_OVERRIDDEN, EMPTY_FLAGS, "pattern: /\\\"[\\.ABCdef]*/" }, { OutputMode.JAVASCRIPT, "[abc]", "[\"ABCdef]*", EMPTY_FLAGS, "pattern: /[\"ABCdef]*/" }, { OutputMode.JAVASCRIPT, "[abc]", "\"[\"ABCdef\"]*\"\"", EMPTY_FLAGS, "pattern: /\"[\"ABCdef\"]*\"\"/" }, { OutputMode.JAVASCRIPT, "[abc]", "[\\.ABCdef]*", EMPTY_FLAGS, "pattern: /[\\.ABCdef]*/" }, { OutputMode.JAVASCRIPT, "[abc]", "\\\"[\\.ABCdef]*", EMPTY_FLAGS, "pattern: /\\\"[\\.ABCdef]*/" }, { OutputMode.JSON, "[abc]", NO_OVERRIDDEN, EMPTY_FLAGS, "\"pattern__regexp\": [\"[abc]\", \"\"]" }, { OutputMode.JSON, "[abc]", "[qwerty]", EMPTY_FLAGS, "\"pattern__regexp\": [\"[qwerty]\", \"\"]" }, { OutputMode.JSON, "[abc]", NO_OVERRIDDEN, I_FLAG, "\"pattern__regexp\": [\"[abc]\", \"i\"]" }, { OutputMode.JSON, "[abc]", NO_OVERRIDDEN, TWO_FLAGS, "\"pattern__regexp\": [\"[abc]\", \"im\"]" }, { OutputMode.JSON, "[abc]", "[qwerty]", I_FLAG, "\"pattern__regexp\": [\"[qwerty]\", \"i\"]" }, { OutputMode.JSON, "[abc]", "[qwerty]", TWO_FLAGS, "\"pattern__regexp\": [\"[qwerty]\", \"im\"]" }, { OutputMode.JSON, "[\"ABCdef]*", NO_OVERRIDDEN, EMPTY_FLAGS, "\"pattern__regexp\": [\"[\\\"ABCdef]*\", \"\"]" }, { OutputMode.JSON, "\"[\"ABCdef\"]*\"\"", NO_OVERRIDDEN, EMPTY_FLAGS, "\"pattern__regexp\": [\"\\\"[\\\"ABCdef\\\"]*\\\"\\\"\", \"\"]" }, { OutputMode.JSON, "[\\.ABCdef]*", NO_OVERRIDDEN, EMPTY_FLAGS, "\"pattern__regexp\": [\"[\\\\.ABCdef]*\", \"\"]" }, { OutputMode.JSON, "\\\"[\\.ABCdef]*", NO_OVERRIDDEN, EMPTY_FLAGS, "\"pattern__regexp\": [\"\\\\\\\"[\\\\.ABCdef]*\", \"\"]" }, { OutputMode.JSON, "[abc]", "[\"ABCdef]*", EMPTY_FLAGS, "\"pattern__regexp\": [\"[\\\"ABCdef]*\", \"\"]" }, { OutputMode.JSON, "[abc]", "\"[\"ABCdef\"]*\"\"", EMPTY_FLAGS, "\"pattern__regexp\": [\"\\\"[\\\"ABCdef\\\"]*\\\"\\\"\", \"\"]" }, { OutputMode.JSON, "[abc]", "[\\.ABCdef]*", EMPTY_FLAGS, "\"pattern__regexp\": [\"[\\\\.ABCdef]*\", \"\"]" }, { OutputMode.JSON, "[abc]", "\\\"[\\.ABCdef]*", EMPTY_FLAGS, "\"pattern__regexp\": [\"\\\\\\\"[\\\\.ABCdef]*\", \"\"]" }, { OutputMode.JSON, "[\"ABCdef]*", NO_OVERRIDDEN, I_FLAG, "\"pattern__regexp\": [\"[\\\"ABCdef]*\", \"i\"]" }, { OutputMode.JSON, "\"[\"ABCdef\"]*\"\"", NO_OVERRIDDEN, I_FLAG, "\"pattern__regexp\": [\"\\\"[\\\"ABCdef\\\"]*\\\"\\\"\", \"i\"]" }, { OutputMode.JSON, "[\\.ABCdef]*", NO_OVERRIDDEN, I_FLAG, "\"pattern__regexp\": [\"[\\\\.ABCdef]*\", \"i\"]" }, { OutputMode.JSON, "\\\"[\\.ABCdef]*", NO_OVERRIDDEN, I_FLAG, "\"pattern__regexp\": [\"\\\\\\\"[\\\\.ABCdef]*\", \"i\"]" }, }; return Arrays.asList( data ); } @Test public void testWrite_FirstNotLast() throws Exception { PatternValidator validator = new PatternValidator(); JavaScriptContext context = createAndInjectContext( validator, ItemStatuses.first() ); executeWrite( validator ); context.getWriter().close(); assertOutput( context, ItemStatuses.first() ); } @Test public void testWrite_Middle() throws Exception { PatternValidator validator = new PatternValidator(); JavaScriptContext context = createAndInjectContext( validator, ItemStatuses.notFirstNorLast() ); executeWrite( validator ); context.getWriter().close(); assertOutput( context, ItemStatuses.notFirstNorLast() ); } @Test public void testWrite_FirstAndLast() throws Exception { PatternValidator validator = new PatternValidator(); JavaScriptContext context = createAndInjectContext( validator, ItemStatuses.last() ); executeWrite( validator ); context.getWriter().close(); assertOutput( context, ItemStatuses.last() ); } @Test public void testWrite_Last() throws Exception { PatternValidator validator = new PatternValidator(); JavaScriptContext context = createAndInjectContext( validator, ItemStatuses.last() ); executeWrite( validator ); context.getWriter().close(); assertOutput( context, ItemStatuses.last() ); } private void executeWrite( PatternValidator validator ) { Pattern pattern = mockPattern( this.regexp, flags ); if( this.overriddenRegexp.equals( NO_OVERRIDDEN ) ) { validator.write(pattern, Optional.empty()); } else { OverridePattern overridePattern = mockOverride(this.overriddenRegexp); validator.write(pattern, new Optional<OverridePattern>( overridePattern )); } } private void assertOutput( JavaScriptContext context, ItemStatus status ) { String prefix; if( status.isLastItem() ) { prefix = "\n"; } else { prefix = ",\n"; } assertThat(context.getWriter().toString(), is(output + prefix)); } private Pattern mockPattern(String regexp, Pattern.Flag... flags) { Pattern pattern = mock(Pattern.class); when(pattern.regexp()).thenReturn(regexp); when(pattern.flags()).thenReturn(flags); return pattern; } private OverridePattern mockOverride(String regexp) { OverridePattern pattern = mock(OverridePattern.class); when(pattern.regexp()).thenReturn(regexp); return pattern; } }